package br.com.werp.regras.geral.integracao;

import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.tabelas.Fisica;
import br.com.werp.regras.geral.vos.tabelas.Juridica;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import java.util.Iterator;
import java.util.List;


/**
 * @author Sobreira
 * Criado em 24/01/2007
 */
public class MigracaoDAO extends MasterDAO {
    protected static Connection srcConn = null;
    protected ByteArrayOutputStream arrayOutputStreamProblemas =
        new ByteArrayOutputStream();
    protected ByteArrayOutputStream arrayOutputStreamSql =
        new ByteArrayOutputStream();
    protected PrintWriter problemas =
        new PrintWriter(arrayOutputStreamProblemas);
    protected Connection connection = null;
    private String arquivo;

    {
        Class.forName(bundle.getString("DBDRIVER_MIGRACAO"));

        srcConn = DriverManager.getConnection(bundle.getString("DBURL_MIGRACAO"),
                bundle.getString("DBUSER_MIGRACAO"),
                bundle.getString("DBPASS_MIGRACAO"));
        connection = getConexao();
    }

    public MigracaoDAO(String banco) throws Exception {
        super(banco);
    }

    public void iniciarModoCaptura() {
        iniciarModoCaptura("");
    }

    protected void processarArquivoMigracao(String arquivo)
        throws Exception {
        String dir = bundle.getString("DIRETORIO_SQL_MIGRACAO");

        Connection con = getConexao();

        BufferedReader reader =
            new BufferedReader(new InputStreamReader(
                    new FileInputStream(dir + arquivo)));
        String linha = reader.readLine();
        System.out.println(con.isClosed());
        con.setAutoCommit(false);

        int contador = 0;

        try {
            while (linha != null) {
                PreparedStatement statement = con.prepareStatement(linha);
                statement.executeUpdate(linha);
                System.out.println(++contador + linha);
                linha = reader.readLine();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println(linha);
            con.rollback();
            con.close();
            System.exit(0);
        }

        con.commit();
        con.close();
    }

    protected void mascararCpf() throws Exception {
        String[] pk = { "fisc_pessoa" };
        String[] exc = { "fisc_naturalidade" };
        Fisica fisica = new Fisica();
        List fisicas = pesquisarVO(getConexao(), fisica);
        iniciarModoCaptura();

        for (Iterator iter = fisicas.iterator(); iter.hasNext();) {
            fisica = (Fisica) iter.next();

            if (Util.isNullOrEmpty(fisica.getFisc_cpf())) {
                continue;
            }

            int pessoa = fisica.getFisc_pessoa();
            fisica = new Fisica();
            fisica.setFisc_pessoa(pessoa);
            fisica.setFisc_cpf(Util.mascararCpf(fisica.getFisc_cpf()));
            atualizarVO(getConexao(), fisica, pk, exc);
        }
    }

    protected void mascararCnpj() throws Exception {
        String[] pk = { "juri_pessoa" };
        String[] exc = { "juri_ramo_atividade" };
        Juridica juridica = new Juridica();
        List juridicas = pesquisarVO(getConexao(), juridica);
        iniciarModoCaptura();

        for (Iterator iter = juridicas.iterator(); iter.hasNext();) {
            juridica = (Juridica) iter.next();

            if (Util.isNullOrEmpty(juridica.getJuri_cnpj())) {
                continue;
            }

            int pessoa = juridica.getJuri_pessoa();
            juridica = new Juridica();
            juridica.setJuri_pessoa(pessoa);
            juridica.setJuri_cnpj(Util.mascararCnpj(juridica.getJuri_cnpj()));
            atualizarVO(getConexao(), juridica, pk, exc);
        }
    }

    public void iniciarModoCaptura(String arquivo) {
        arquivo = this.getClass().getSimpleName();

        this.arquivo = bundle.getString("DIRETORIO_SQL_MIGRACAO") +
            arquivo.trim();
        sqls = new PrintWriter(arrayOutputStreamSql);

        if (sqls != null) {
            gerarSqlsArquivo = true;
        }
    }

    public void finalizarModoCaptura() throws IOException {
        problemas.flush();
        sqls.flush();

        String arquivoSql = arquivo + ".sql";
        FileOutputStream sqlWriter = new FileOutputStream(arquivoSql);

        sqlWriter.write(arrayOutputStreamSql.toByteArray());
        sqlWriter.close();

        String arquivoTxt = arquivo + "_problemas.txt";
        FileOutputStream problemasWriter = new FileOutputStream(arquivoTxt);

        problemasWriter.write(arrayOutputStreamProblemas.toByteArray());
        problemasWriter.close();
        System.out.println(arquivoSql + " Gravado.");
        System.out.println(arquivoTxt + " Gravado.");
    }

    protected void beginTrans(Connection conn) throws SQLException {
    }

    protected void rollBackTrans(Connection conn) throws SQLException {
    }

    protected void commitTrans(Connection conn) throws SQLException {
    }

    public void liberaConeccao(Connection conn) {
    }
}
